package predicate

type op string

func (o op) String() string {
	return string(o)
}

var (
	// OpEqual 等比较运算符
	OpEqual op = "="
	OpLt    op = "<"
	OpGt    op = ">"
	OpLe    op = "<="
	OpGe    op = ">="

	// OpAnd opOr opNot 逻辑运算符
	OpAnd op = "and"
	OpOr  op = "or"
	opNot op = "not"

	// SubQueryOpIn SubQueryOpExists subQuery相关操作符
	SubQueryOpIn     op = "in"
	SubQueryOpExists op = "exist"
)

type Expression interface {
	expr()
}

// Selectable selector中通过.Select(select selectable)使用
// Selectable 标记 canSelect 列、聚合函数、子查询、表达式（是 Expression）
// Selectable 的部分都可以设置别名alias
type Selectable interface {
	selectable()
}

// TableReference select * from [tableReference]
type TableReference interface {
	tableReference()
}

// Alias 别名 支持：Column、Aggregate、Join、SubQuery、table
// select语句不能使用别名的位置：where、group by、having、order by; 因为sql的查询顺序如下，在where、group by等子句执行时，别名还没被计算
// sql查询逻辑处理顺序：from,where,group by,having,select(计算别名),order by,limit
type Alias interface {
	alias()
}

// Assignable 用于on conflict的update、upsert部分，表达冲突可赋值的类型
type Assignable interface {
	Assignable()
}
